#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string>

const std::string filename = "/dev/null";

// 守护进程化
void Daemom(const std::string &Chdir)
{
    // 1.屏蔽信号
    signal(SIGCLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);
    signal(SIGSTOP, SIG_IGN);

    // 2.fork子进程，子进程执行setsid()，创建守护进程，父进程退出
    if (fork() > 0)
        exit(0);
    setsid();

    // 3.将守护进程的工作路径更改为根目录
    if(!Chdir.empty()) chdir("/");

    // 由于守护进程没有终端，不能和用户进程交互，所以我们需要将标准输入，标准输出，标准错误重定向到 /dev/null下
    int fd = open(filename.c_str(), O_RDWR, 000);
    if (fd > 0)
    {
        dup2(fd, 0);
        dup2(fd, 1);
        dup2(fd, 2);
    }

    // daemon(0, 0);

    // 死循环，守护进程是不退的
    while (true)
        ;

    return;
}
